import axios, { type AxiosInstance, type AxiosRequestConfig } from "axios"
import { useUserStoreHook } from "@/store/modules/user"
import { ElMessage,ElMessageBox } from "element-plus"

import { getToken } from "@/utils/cache/cookies"
export enum ResultEnum {
	SUCCESS = 0, // 响应成功
	ERROR = 500, // 错误拦截
	OVERDUE = 401,
	TIMEOUT = 5000, // 请求操作
	TYPE = "success" 
}
const config = {
	// 默认地址请求地址，可在 .env.*** 文件中修改
	baseURL: import.meta.env.VITE_API_URL as string,
	// 设置超时时间（5s）
	timeout: ResultEnum.TIMEOUT as number,
	// 跨域时候允许携带凭证
	withCredentials: false,
  
};

function createService  (){
    // 创建一个 Axios 实例
    const service = axios.create(config)
    // 请求拦截
    service.interceptors.request.use((config) => config,
        // 发送失败
        (error) => Promise.reject(error)
    )

    // 响应拦截（可根据具体业务作出相应的调整）
    service.interceptors.response.use((response)=>{
      // apiData 是 API 返回的数据
      const res = response.data as any
      // 这个 Code 是和后端约定的业务 Code
      if(res.code != ResultEnum.SUCCESS){
        ElMessage(res.msg)
        if(res.code==401){
            ElMessageBox.alert('登录过期，请重新登录', '提示', {})
        }
        return Promise.reject(service.interceptors.response);
      }else {
        return response.data;
      }


  },(error) => {
    // 对响应错误做点什么
    if (error.message.indexOf('timeout') != -1) {
        ElMessage.error('网络超时');
    } else if (error.message == 'Network Error') {
        ElMessage.error('网络连接错误');
    } else {
        if (error.response.data) ElMessage.error(error.response.statusText);
        else ElMessage.error('接口路径找不到');
    }
    ElMessage.error(error.response.data)
    return Promise.reject(error);
    })
    return service

} 


/** 创建请求方法 */
function createRequestFunction(service: AxiosInstance) {
    return function <T>(config: AxiosRequestConfig): Promise<T> {
      const configDefault = {
        headers: {
          // 携带 Token
          Authorization: "Bearer " + getToken(),  
          "Content-Type": "application/json", // 默认提交格式
        },
        timeout: 5000,
        baseURL: import.meta.env.VITE_BASE_API,
      }
      return service(Object.assign(configDefault, config))
    }
  }

  

  /** 用于网络请求的实例 */
export const service = createService()
/** 用于网络请求的方法 */
export const request = createRequestFunction(service)

